package com.study.chunguard.common.lock;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Getter;

/**
 * LockCondition 是一个封装类，它包含了在实现幂等性操作时所需要的关键信息。
 * <p>
 * 这个类的主要组成部分包括：
 * <p>
 * - 是否开启获取锁及检查（enabled）：如果为 true，则执行获取锁及检查；如果为 false，则跳过获取锁及检查。
 * <p>
 * - 锁定键（lockKey）：用于分布式锁的键，唯一标识了应该被锁定的资源。
 * <p>
 * - 查询包装器（queryWrapper）：定义了用于检查数据是否已存在的查询条件。
 * <p>
 * - 消息（msg）：如果已存在符合查询条件的数据，那么这个消息将被用于抛出 IdempotencyException 异常。
 * <p>
 * 使用 LockCondition 类可以让代码更加清晰和易于理解。它提供了一种方式，使得在实现多条件幂等性检查时，可以将关键信息组织在一起。
 *
 * @author zhaowenhao
 * @since 2023-05-14
 */
@Getter
public class LockCondition<T> {

    private final boolean enabled;

    private final String lockKey;

    private final QueryWrapper<T> queryWrapper;

    private final String msg;


    public LockCondition(boolean enabled, String lockKey, QueryWrapper<T> queryWrapper, String msg) {
        this.lockKey = lockKey;
        this.queryWrapper = queryWrapper;
        this.msg = msg;
        this.enabled = enabled;
    }

    public LockCondition(String lockKey, QueryWrapper<T> queryWrapper, String msg) {
        this.enabled = true;
        this.lockKey = lockKey;
        this.queryWrapper = queryWrapper;
        this.msg = msg;
    }

}
